放了一天假怎麼到了晚上有點小空虛。
另外再講一次黑白大廚好好看,好想要到處搜刮米其林餐廳喔可惜大部分都有點爆預算QQ
Swift 中用來處理 HTTP 請求的方法是透過 URLSession,方法大概是用既有的函式去發出請求,然後處理回傳的資料。在下方的範例中,guard let
這邊是會對 url string 做格式上的確認,後續再發送請求拿資料。而 URLSessionTask 被創建後並不會被自動執行,因此要用 .resume 來啟動。
func fetchData() {
guard let url = URL(string: "https://www.api.com/category/1") else { return }
let request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error: \(error.localizedDescription)")
return
}
guard let data = data else {
print("No data received.")
return
}
do {
// ...
} catch {
// ...
}
}
task.resume()
}
URLSession.shared 會創建一個可以被共用的 instance,這個東西可以在整個 app 中被使用,不用每次都額外創建新的 instance 浪費資源。URLSession.shared 底下有幾個常用的函式,像是 dataTask, downloadTask, uploadTask 等。
如果需要自定義的 URLSession,可以創建不同的 URLSessionConfiguration,然後再把 config 丟回 URLSession 裡。常見的選項包含 URLSessionConfiguration.default,可以調整 request 細節,像設定 timeout 時間等。URLSessionConfiguration.background,則會在背景狀態去完成任務,可以用來做大檔案的處理。URLSessionConfiguration.ephemeral 則只會記錄在記憶體中,app 關閉後所有內容都會消失。
另外還有 URLSession.shared.webSocketTask,可以讓 app 和 server 之間創建長時間的通訊,可以發送的訊息種類包含 string 和 data (binary message)。
let url = URL(string: "wss://websocket.com/session/1")!
let webSocketTask = URLSession.shared.webSocketTask(with: url)
webSocketTask.resume() // 啟動 websocket 連接
let nesMsg = URLSessionWebSocketTask.Message.string("start websocket")
webSocketTask.send(newMsg) { error in
if let error = error {
// ...
} else {
// ...
}
}
func receiveMsg() {
webSocketTask.receive { result in
switch result {
case .success(let message):
switch message {
case .string(let text):
print("Received string: \(text)")
case .data(let data):
print("Received data: \(data)")
}
receiveMessage()
case .failure(let error):
print("Failed to receive message: \(error)")
}
}
}
receiveMsg()